package com.xuecheng.content.constant;

/**
 * @author 勾新杰
 * @version 1.0
 * @description: 课程缓存常量
 * @date 2025/3/21 23:17
 */
public class CourseCacheConstant {

    /**
     * redis缓存的key前缀
     */
    public final static String KEY_PREFIX = "course:";

    /**
     * 特殊值，表示未找到，避免缓存穿透
     */
    public final static String ESPECIAL_VALUE = "error";

    /**
     * 特殊值设置1分钟过期
     */
    public final static Integer ESPECIAL_VALUE_EXPIRE_SECONDS = 1;

    /**
     * 课程预览信息缓存过期时间，单位：分钟
     */
    public final static Integer KEY_EXPIRE_MINUTES = 5;

    /**
     * set nx的分布式锁的key
     */
    public final static String LOCK_PREFIX = "course_lock:";

    // 这里是个巨坑，也就是set nx这个获取分布式锁得最大缺陷：就是：
    // 1. 锁得过期时间不能不设置，不设置的话加入线程内异常或者宕机了，那么锁就一直存在，往后所有线程都查不了数据库
    // 2. 锁的过期时间不能太短，否则线程内的工作还没做完，锁就被自动释放了。
    /**
     * 分布式锁的过期时间，单位：分钟
     */
    public final static Integer LOCK_EXPIRE_MINUTES = 1;

    /**
     * 自旋锁的尝试等待时间，超出这个时间，线程就放弃获取锁
     */
    public final static Integer LOCK_TRY_WAIT_SECONDS = 0;

    /**
     * 分布式锁的默认持有时间，redission会创建一个看门狗的后台线程，如果超过这个时间线程还没有完成任务，那么redission会自动给锁续期
     */
    public final static Integer LOCK_HOLD_SECONDS = 30;
}
